package com.clei.dto.db;

import com.clei.dto.ReadPropertyDesc;
import com.clei.utils.PrintUtil;
import com.clei.utils.StringUtil;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * MySQL 导出配置项
 *
 * @author Y
 * @date 2024-03-25
 **/
public class MySQLExportConfig {

    /**
     * 属性描述list
     */
    private static final List<ReadPropertyDesc> PROPERTY_LIST;

    static {
        List<ReadPropertyDesc> propertyList = new ArrayList<>(5);
        propertyList.add(new ReadPropertyDesc("database", "数据库* : "));
        propertyList.add(new ReadPropertyDesc("tables", "表(多个以英文逗号分隔) : "));
        propertyList.add(new ReadPropertyDesc("excludeTables", "排除表(多个以英文逗号分隔) : "));
        propertyList.add(new ReadPropertyDesc("exportPath", "导出路径* : "));
        propertyList.add(new ReadPropertyDesc("exportType", "导出类型(1仅数据 2仅结构 3数据和结构)* : "));
        PROPERTY_LIST = Collections.unmodifiableList(propertyList);
    }

    /**
     * 数据库
     */
    private String database;

    /**
     * 表
     */
    private String tables;

    /**
     * 排除表
     */
    private String excludeTables;

    /**
     * 导出路径
     */
    private String exportPath;

    /**
     * 导出类型 1仅数据 2仅结构 3数据和结构
     */
    private String exportType;

    /**
     * 表list
     */
    private List<String> tableList;

    /**
     * 排除表set
     */
    private Set<String> excludeTableSet;

    /**
     * 导出类型 1仅数据 2仅结构 3数据和结构
     */
    private Integer exportTypeValue;

    /**
     * 装配
     */
    public boolean assemble() {
        if (StringUtil.isBlank(database) || StringUtil.isBlank(exportPath) || StringUtil.isBlank(exportType)) {
            PrintUtil.log("数据库、导出路径、导出类型必填！");
            return false;
        } else {
            this.tableList = StringUtil.isBlank(tables) ? null : Arrays.stream(tables.split(",")).collect(Collectors.toList());
            this.excludeTableSet = StringUtil.isBlank(excludeTables)
                    ? Collections.emptySet() : Arrays.stream(tables.split(",")).collect(Collectors.toSet());
            int et = Integer.parseInt(exportType);
            this.exportTypeValue = et > 3 ? 3 : Math.max(et, 1);
            return true;
        }
    }

    public static List<ReadPropertyDesc> getPropertyList() {
        return PROPERTY_LIST;
    }

    public String getDatabase() {
        return database;
    }

    public String getExportPath() {
        return exportPath;
    }

    public List<String> getTableList() {
        return tableList;
    }

    public Set<String> getExcludeTableSet() {
        return excludeTableSet;
    }

    public Integer getExportTypeValue() {
        return exportTypeValue;
    }
}
